/*
 * @Author: huxukang
 * @Date: 2025-01-09 09:47:46
 * @LastEditors: huxukang
 * @LastEditTime: 2025-01-13 17:38:40
 * @FilePath: \hu-package\utils\fileUtils.js
 * @Description: 
 * 
 * Copyright (c) 2025 by huxk, All Rights Reserved. 
 */


/**
 * 
 * 将file对象转为base64
 * @param {*} file file文件
 * @returns 返回一个promise对象（base64）;
 * 
 */
function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    // 创建一个新的 FileReader 对象
    const reader = new FileReader();
    // 读取 File 对象
    reader.readAsDataURL(file);
    // 加载完成后
    reader.onload = function () {
      // 将读取的数据转换为 base64 编码的字符串
      const base64String = reader.result.split(',')[1];
      // 解析为 Promise 对象，并返回 base64 编码的字符串
      resolve(base64String);
    };

    // 加载失败时
    reader.onerror = function () {
      reject(new Error('Failed to load file'));
    };
  });
}


/**
 * 将文件流转为base64
 * @param {*} blob 
 * @returns 返回一个promise对象（base64）
 */
function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = () => resolve(reader.result.split(",")[1]);
    reader.onerror = reject;
  });
}


/**
 * 
 * 将base64转为file对象
 * @param {*} base64 
 * @param {*} fileName 
 * @returns 返回一个file对象
 */
function base64ToFile(base64, fileName) {
  let arr = base64.split(',');
  let mime = arr[0].match(/:(.\*?);/)[1];
  let bstr = atob(arr[1]);
  let n = bstr.length;
  let u8arr = new Uint8Array(n);

  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new File([u8arr], fileName, { type: mime });
}


/**
 * 将base64转为blod
 * @param {*} base64 
 * @returns 返回blod
 */
function base64ToBlob(base64) {
  var arr = base64.split(","),
    mime = arr[0].match(/:(.\*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime,
  });
}


/**
 * 将流转为file对象
 * @param {*} blob 
 * @param {*} fileName 
 * @returns 返回file对象
 */
function blobToFile(blob, fileName) {
  return new File([blob], fileName);
}

/**
 * 
 * 将file对象转为文件流blod
 * @param {*} file 
 * @returns 返回一个blod
 */
function fileToBlob(file) {
  return new Blob([file], { type: file.type });
}

export default fileUtils = {
  fileToBase64,
	fileToBlob,
	base64ToFile,
	base64ToBlob,
	blobToFile,
	blobToBase64
}